Problem
【PA2015】Siano
Description
农夫买了一片亩的土地,他要在这上面种草。
他在每一亩土地上都种植了一种独一无二的草,其中,第亩土地的草每天会长高厘米。
一共会进行次收割,其中第次收割在第天,并把所有高度大于等于的部分全部割去。
想知道,每次收割得到的草的高度总和是多少,你能帮帮他吗?
Input
第一行包含两个正整数,分别表示亩数和收割次数。
第二行包含个正整数,其中第个数为,依次表示每亩种植的草的生长能力。
接下来行,每行包含两个正整数,依次描述每次收割。
Output
输出行,每行一个整数,依次回答每次收割能得到的草的高度总和。
Sample Input
1 | 4 4 |
Sample Output
1 | 6 |
Explanation
第天,草的高度分别为,收割后变为。
第天,草的高度分别为,收割后变为。
第天,草的高度分别为,收割后变为。
第天,草的高度分别为,收割后变为。
HINT
, ,
数据保证,并且任何时刻没有任何一亩草的高度超过。
Source
By Claris
标签:线段树
Solution
比较灵活的线段树。
观察题目可以发现一个性质,即长速快的在任意时刻都比长速慢的高度高。这是由于每次修剪都是将所有的剪到同一高度,这样长速快的在修剪后的高度一定大于等于长速慢的在修剪后的高度。
将长速从低到高排序,不会影响询问,并且每次询问剪去的部分一定是一个后缀。那么可以在线段树上分治寻找剪和不剪的分界点,同时累加答案。
对于每个区间需要维护其长速之和、高度和两个基础元素。为了方便询问,需要维护高度的最大和最小值,即该区间最右边和最左边的苗的高度。这样如果当前区间的最大高度,可知不用继续递归;如果当前区间最小高度,可知整个区间都要修剪,打区间标记后返回。而对于标记,每个区间需要维护三个元素,分别表示该区间中的所有高度均变为,这个变化发生在时刻,上一次递归到该区间的时间是。询问每次递归进入一个区间先计算从上次递归到该区间也就是到现在总共长了多少,更新信息。注意和不能合并为一个变量,这是由于该区间上次被递归到时可能先更新了信息,但是并未打标记,即其下面的子区间没有更新信息,故和不同。
一棵线段树即可维护,某些细节注意一下即可。
Code
1 |
|